package thread;

/**
 * 线程常用方法-中断
 */
public class ThreadMethod {

    public static void main(String[] args) throws InterruptedException {

        /*
            setName 设置线程名称 使之与参数 name 相同
            getName 返回该线程的名称
            start   是该线程开始执行;java虚拟机底层调用该线程的 start0 方法
            run     调用线程对象 run 方法
            setPriority 更改线程的优先级
            getPriority 获取线程的优先级
            sleep   在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
            interrupt   中断线程
         */

        /*
            start 底层会创建新的线程， 调用 run ，run 就是一个简单的方法，不会启动新线程
            线程优先级的范围
            interrupt 中断线程 但没有真正的结束线程。所以一般用于中断正在休眠线程
            sleep   线程的静态方法，使当前线程休眠
         */

        ThreadDemo1 threadDemo1 = new ThreadDemo1();
        threadDemo1.setName("lmy");
        threadDemo1.setPriority(Thread.MIN_PRIORITY);   //1
        threadDemo1.start();

        //主线程打印5个 hi，然后就中断子线程的休眠
        for (int i = 0; i < 5; i++) {
            Thread.sleep(1000);
            System.out.println("hi " + i);
        }
        System.out.println(threadDemo1.getName() + "线程优先级 = " + threadDemo1.getPriority()); //1
        //当执行到这里时，就会中断 t 线程的休眠
        threadDemo1.interrupt();
    }
}

class ThreadDemo1 extends Thread {

    @Override
    public void run() {
        while (true) {
            for (int i = 0; i < 100; i++) {
                //Thread.currentThread().getName() 获取当前线程名称
                System.out.println(Thread.currentThread().getName() + " 吃饱了~~~~~~~~" + i);
            }
            try {
                System.out.println(Thread.currentThread().getName() + " 休眠中~~~~~~~~");
                Thread.sleep(20 * 1000);//20s
            } catch (InterruptedException e) {
                // 当线程执行到 interrupt 方法时,就会 catch一个异常
                // InterruptedException 是捕获到一个中断异常
                System.out.println(Thread.currentThread().getName() + " 被 interrupt....");
            }
        }

    }

}